// @Desc:
// @CreateTime: 2020/11/1
package wx

import (
	"net/http"
	"regexp"
	"strings"
	"time"

	"gitee.com/xuesongtao/gotool/xlog"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"mycrm.com/controller/statistics"
	"mycrm.com/module"
	"mycrm.com/module/user"
)

// 微信 index
func ComeWxMsg(c *gin.Context) {
	if c.Query("echostr") != "" {
		// 用于微信配置验签返回的
		c.Writer.Write([]byte(c.Query("echostr")))
		return
	}
	var reqMsg WXReqMsg
	if err := c.ShouldBindXML(&reqMsg); err != nil {
		xlog.Error("c.ShouldBindXML(&reqMsg) is failed, err: ", err)
	}
	xlog.Info("wxreqData: ", reqMsg)
	msgType := reqMsg.MsgType
	switch msgType {
	case "event":
		WXMsgReplyEvent(c, &reqMsg)
	case "voice":
		WXMsgReplyVoice(c, &reqMsg)
	default: // 默认按文本回复
		WXMsgReplyText(c, &reqMsg, "")
	}
}

// 取消/关注事件
func WXMsgReplyEvent(c *gin.Context, reqText *WXReqMsg) {
	// subscribe(订阅)、unsubscribe(取消订阅)
	if reqText.Event == "subscribe" {
		// 您好，欢迎关注南部县盛嘉装饰！如果需要帮助您可以通过聊天窗口咨询，客服会第一时间回复您的信息！您也可以拨打电话0817-5663992直接沟通，或者您也可留下您的联系方式。
		respText := "欢迎您关注南部县盛嘉装饰！您可以拨打电话0817-5663992直接咨询，或者您也可留下您的联系方式\n" +
			"\n" +
			"注: 如果您是【员工】烦请您发下您的电话号码, 后期才能更好的为您提供任务查询等服务!"
		WXMsgReplyText(c, reqText, respText)
	}
	if reqText.Event == "unsubscribe" {
		// 将 user 中的 open_id 清空, is_attention 为 0
		module.Db.Model(&user.CrmUser{}).Where("open_id = ?", c.Query("openid")).Updates(map[string]interface{}{"is_attention": 0, "open_id": ""})
	}
}

// WXMsgReplyText 微信消息回复
func WXMsgReplyText(c *gin.Context, reqMsg *WXReqMsg, respText string) {
	respTextMsg := &WXRespTextMsg{
		ToUserName:   reqMsg.FromUserName,
		FromUserName: reqMsg.ToUserName,
		CreateTime:   time.Now().Unix(),
		MsgType:      "text",
	}
	// 如果有回复文本就直接回复
	if respText != "" {
		respTextMsg.Content = respText
		xlog.Info("wxrespXml: ", respTextMsg)
		c.XML(http.StatusOK, &respTextMsg)
		return
	}

	// 回复前缀
	// respTextMsg.Content = fmt.Sprintf("[%s]:\n", time.Now().Format("15:04:05"))
	openId := c.Query("openid")
	switch reqMsg.Content {
	case "1":
		// 获取我的回访任务
		respTextMsg.Content = statistics.MyTask2Wx(openId)
	case "2":
		// 统计
		respTextMsg.Content = statistics.Statistics2Wx(openId)
	default:
		// 纪念使用
		if strings.Contains(reqMsg.Content, "爱") {
			respTextMsg.Content += "薛爱珊一辈子哟!"
		}

		// 先判断下数字是否是电话, 不是的话就回复下命令数字
		isPhone, _ := regexp.MatchString(`^(13[0-9]{9}$|14[0-9]{9}$|15[0-9]{9}$|17[0-9]{9}$|18[0-9]{9})$|(^(0\d{10})|^(0\d{2}-\d{8}))$`, reqMsg.Content)
		xlog.Info("isPhone: ", isPhone)
		if isPhone {
			TextIsPhone(c, reqMsg, respTextMsg)
		} else {
			// 如果这里没有内容才添加值
			if respTextMsg.Content == "" {
				respTextMsg.Content = "您可以回复以下数字:\n" +
					"1. 我的今日回访任务\n" +
					"2. 统计\n" +
					"\n" +
					"注: 如果未成功进行电话配对回复的命令无效!"
			}
		}
	}
	c.XML(http.StatusOK, &respTextMsg)
}

// 是联系电话, 进行对用户进行关联
func TextIsPhone(c *gin.Context, reqMsg *WXReqMsg, respTextMsg *WXRespTextMsg) {
	err := module.Db.Model(&user.CrmUser{}).Where("phone = ?", reqMsg.Content).Updates(map[string]interface{}{"is_attention": 1, "open_id": c.Query("openid")}).Error
	if err == gorm.ErrRecordNotFound {
		// respTextMsg.Content = "您填写的电话, 客户系统不存在, 请重新填写"
		respTextMsg.Content = "感谢您的留言电话, 我们会在 24 小时之内与您联系! \n" +
			"\n" +
			"注: 如果您是【员工】您的联系方式与系统联系不匹配, 请输入正确的联系方式!"
	} else {
		respTextMsg.Content = "恭喜您成功完成电话号码配对!\n" +
			"\n" +
			"您可以回复以下数字:\n" +
			"1. 我的今日回访任务\n" +
			"2. 统计\n" +
			"\n" +
			"说明: 支持语音识别, 如: 统计-则会返回【统计】"
	}
}

// WXMsgReplyText 微信消息回复
func WXMsgReplyVoice(c *gin.Context, reqText *WXReqMsg) {
	respTextMsg := WXRespTextMsg{
		ToUserName:   reqText.FromUserName,
		FromUserName: reqText.ToUserName,
		CreateTime:   time.Now().Unix(),
		MsgType:      "text",
	}
	openId := c.Query("openid")
	// 纪念使用
	if strings.Contains(reqText.Recognition, "爱") {
		respTextMsg.Content = "薛爱珊一辈子哟!"
	}
	if strings.Contains(reqText.Recognition, "任务") {
		// 我的任务
		respTextMsg.Content = statistics.MyTask2Wx(openId)
	}
	if strings.Contains(reqText.Recognition, "统计") {
		// 统计
		respTextMsg.Content = statistics.Statistics2Wx(openId)
	}
	if respTextMsg.Content == "" {
		respTextMsg.Content = "主人暂时没有您要的内容: \n" +
			reqText.Recognition
	}

	xlog.Info("wxrespXml: ", respTextMsg)
	c.XML(http.StatusOK, &respTextMsg)
}
